home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / t1tot2.ps < prev    next >
Text File  |  1997-05-28  |  8KB  |  304 lines

  1. %    Copyright (C) 1997 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % t1tot2.ps
  16. % Convert a Type 1 font with Type 1 CharStrings to Type 2.
  17. % **************** THIS FILE DOES NOT WORK. ****************
  18. % **************** DON'T TRY TO USE IT. ****************
  19.  
  20. (type1ops.ps) runlibfile
  21.  
  22. % In the following lists, implemented conversions are marked with a +.
  23. % The following conversions are required for each CharString:
  24. % +    Remove lenIV initial bytes and decrypt.
  25. %    Move all hstem/vstem commands to the beginning (with -hm if any
  26. %      hint replacement), including any from subroutines.
  27. %    Fold side bearing into first moveto.
  28. % +    Remove all closepath.
  29. %    Convert Flex othersubrs to new flex commands.
  30. %    Convert hint replacement to hintmask.
  31. %    Convert MM blend othersubrs to new blend command.
  32. %    For seac, convert char bodies to subrs, add hint replacement.
  33. %    Make width relative to nominalWidthX.
  34. % The following patterns allow shortening CharStrings:
  35. % +    rlineto+ => rlineto
  36. % +    vlineto (hlineto vlineto)* [hlineto] => vlineto
  37. % +    hlineto (vlineto hlineto)* [vlineto] => hlineto
  38. % +    rrcurveto+ => rrcurveto
  39. % +    rrcurveto+ rlineto => rcurveline
  40. % +    rlineto+ rrcurveto => rlinecurve
  41. % +    (vhcurveto hvcurveto)* [vhcurveto ["hrcurveto"] | "vrcurveto"] =>
  42. %      vhcurveto
  43. % +    (hvcurveto vhcurveto)* [hvcurveto ["vrcurveto"] | "hrcurveto"] =>
  44. %      hvcurveto
  45. %    "rvcurveto" (0 y1 x2 y2 0 y3 rrcurveto)* => vvcurveto
  46. %    "hrcurveto" (x1 0 x2 y2 x3 0 rrcurveto)* => hhcurveto
  47.  
  48. % Convert a CharString from Type 1 to Type 2.
  49. % Free variables: font.
  50.  
  51. /t1tot2 {        % <charstring1> t1tot2 <charstring2>
  52.   10 dict begin
  53.     % Collect the hints, side bearing, and width.
  54.   /hints 20 dict def
  55.   /hmask 0 def        % 1 = vstem, 2 = hstem
  56.   /hmcount null def
  57.   /lsb null def
  58.   /width null def
  59.   dup t1hintops t1scan pop
  60.   t1t2ops t1scan
  61.     % Insert the hints and width at the beginning.
  62.   mark width
  63.   counttomark 2 add -1 roll aload pop ]
  64.     % Convert the string back to encoded form.
  65.   DEBUG {
  66.     (++++ ) print [ 1 index { dup null eq { pop } if } forall ] == flush
  67.   } if
  68.   charproc_string end
  69. } bind def
  70. /t1scan {        % <charstring> <opsdict> t1scan <tokens>
  71.   5 dict begin
  72.   /opsdict exch def
  73.     % Remove encryption and convert to symbolic form for processing.
  74.   mark /seed 4330 /lenIV font /lenIV .knownget not { 4 } if .dicttomark
  75.   /eexecDecode filter /f exch def
  76.   /cstr [ f charstack_read /END 8 { null } repeat ] def
  77.   DEBUG {
  78.     (**** ) print [ cstr { dup null eq { pop } if } forall ] == flush
  79.   } if
  80.     % Scan the unpacked string.
  81.   /i 0 def {
  82.     % The /END token will exit from this loop.
  83.     opsdict cstr i get .knownget { exec } if
  84.     /i i 1 add def
  85.   } loop
  86.   f closefile cstr end
  87. } bind def
  88. /ciget {        % <di> ciget <token>
  89.   i add dup 0 ge { cstr exch get } { pop null } ifelse
  90. } bind def
  91. /ciput {        % <di> <token> ciput -
  92.   exch i add exch cstr 3 1 roll put
  93. } bind def
  94. /ciswap {        % <di> <dj> ciswap -
  95.   2 copy exch ciget exch ciget 3 1 roll ciput ciput
  96. } bind def
  97. /ciskip {        % <di> ciskip -
  98.   i add /i exch def
  99. } bind def
  100.  
  101. % Hint scanning procedures.
  102. /addhint {
  103.   hints 1 index known { pop } { hints dup length 3 -1 roll put } ifelse
  104. } bind def
  105.  
  106. /t1hintops mark /END { 0 null ciput exit } bind
  107.  
  108. /vstem {
  109.   cstr i 2 sub 3 getinterval addhint
  110.   /hmask hmask 1 or store
  111. } bind
  112. /hstem {
  113.   cstr i 2 sub 3 getinterval addhint
  114.   /hmask hmask 2 or store
  115. } bind
  116. /callsubr {
  117.     %**** DOESN'T HANDLE FLEX YET ****
  118.   -1 ciget /pop eq {
  119.     % This must be a <#> 1 3 /callothersubr /pop /callsubr sequence.
  120.     hmcount null eq { /hmcount hints length store } if
  121.     -5 ciget
  122.   } {
  123.     -1 ciget
  124.   } ifelse
  125.   font /Private get /Subrs get exch get
  126.   t1hintops t1scan pop
  127. } bind
  128. /hsbw {
  129.   /lsb -2 ciget store
  130.   /width -1 ciget store
  131. } bind
  132. /vstem3 {
  133.   [ -6 ciget -5 ciget /vstem ] addhint
  134.   [ -4 ciget -3 ciget /vstem ] addhint
  135.   [ -2 ciget -1 ciget /vstem ] addhint
  136.   /hmask hmask 1 or store
  137. } bind
  138. /hstem3 {
  139.   [ -6 ciget -5 ciget /hstem ] addhint
  140.   [ -4 ciget -3 ciget /hstem ] addhint
  141.   [ -2 ciget -1 ciget /hstem ] addhint
  142.   /hmask hmask 2 or store
  143. } bind
  144. /sbw {
  145.     %**** WHAT ABOUT Y? ****
  146.   /lsb -4 ciget store
  147.   /width -2 ciget store
  148. } bind
  149.  
  150. .dicttomark readonly def    % t1hintops
  151.  
  152. % Conversion procedures.
  153. /t1t2ops mark /END { 0 null ciput exit } bind
  154.  
  155. /hstem {
  156.     % We handled the hints separately, drop them here.
  157.   -2 1 0 { null ciput } for
  158. } bind
  159. /vstem 1 index
  160. /rlineto {
  161.   3 ciget /rlineto eq {
  162.     0 null ciput
  163.   } {
  164.     7 ciget /rrcurveto eq {
  165.       0 null ciput
  166.       7 /rlinecurve ciput
  167.     } if
  168.   } ifelse
  169. } bind
  170. /vlineto {
  171.   2 ciget /hlineto eq {
  172.     0 null ciput
  173.     2 4 ciget /vlineto eq { null } { /vlineto } ifelse ciput
  174.   } if
  175. } bind
  176. /hlineto {
  177.   2 ciget /vlineto eq {
  178.     0 null ciput
  179.     2 4 ciget /hlineto eq { null } { /hlineto } ifelse ciput
  180.   } if
  181. } bind
  182. /rrcurveto {
  183.   7 ciget /rrcurveto eq {
  184.     0 null ciput
  185.   } {
  186.     3 ciget /rlineto eq {
  187.       0 null ciput
  188.       3 /rcurveline ciput
  189.     } {
  190.     %**** WRONG IF MULTIPLE RRCURVETO ****
  191.       -6 ciget 0 eq {
  192.     -6 null ciput
  193.     0 /vhcurveto ciput
  194.       } {
  195.     -5 ciget 0 eq {
  196.       -5 null ciput
  197.       -1 -2 ciswap
  198.       0 /hvcurveto ciput
  199.     } if
  200.       } ifelse
  201.     } ifelse
  202.   } ifelse
  203. } bind
  204. /vhcurveto {
  205.   5 ciget /hvcurveto eq {
  206.     0 null ciput
  207.     10 ciget /vhcurveto eq {
  208.       5 null ciput
  209.     } {
  210.       12 ciget /rrcurveto eq 6 ciget 0 eq and {
  211.     5 null ciput
  212.     6 null ciput
  213.     12 /vhcurveto ciput
  214.     12 ciskip
  215.       } {
  216.     5 /vhcurveto ciput
  217.     5 ciskip
  218.       } ifelse
  219.     } ifelse
  220.   } {
  221.     7 ciget /rrcurveto eq {
  222.       1 ciget 0 eq {
  223.     0 null ciput
  224.     1 null ciput
  225.     5 6 ciswap
  226.     7 /vhcurveto ciput
  227.     7 ciskip
  228.       } if
  229.     } if
  230.   } ifelse
  231. } bind
  232. /hvcurveto {
  233.   5 ciget /vhcurveto eq {
  234.     0 null ciput
  235.     10 ciget /hvcurveto eq {
  236.       5 null ciput
  237.     } {
  238.       12 ciget /rrcurveto eq 7 ciget 0 eq and {
  239.     5 null ciput
  240.     7 null ciput
  241.     10 11 ciswap
  242.     12 /hvcurveto ciput
  243.     12 ciskip
  244.       } {
  245.     5 /hvcurveto ciput
  246.     5 ciskip
  247.       } ifelse
  248.     } ifelse
  249.   } {
  250.     7 ciget /rrcurveto eq {
  251.       2 ciget 0 eq {
  252.     0 null ciput
  253.     2 null ciput
  254.     7 /hvcurveto ciput
  255.     7 ciskip
  256.       } if
  257.     } if
  258.   } ifelse
  259. } bind
  260. /closepath {
  261.   0 null ciput
  262. } bind
  263. /hsbw {
  264.     % We handled this separately, drop it.
  265.   -2 1 0 { null ciput } for
  266. } bind
  267. /dotsection {
  268.     %**************** NYI ****************
  269. } bind
  270. /vstem3 {
  271.     % We handled the hints separately, drop them here.
  272.   -6 1 0 { null ciput } for
  273. } bind
  274. /hstem3 1 index
  275. /seac {
  276.     %**************** NYI ****************
  277. } bind
  278. /sbw {
  279.     % We handled this separately, drop it.
  280.   -4 1 0 { null ciput } for
  281. } bind
  282. /callothersubr {
  283.   -1 ciget 3 eq {
  284.     %**** HANDLE HINT REPLACEMENT ****
  285.     -2 ciget 1 eq 1 ciget /pop eq and 2 ciget /callsubr eq and {
  286.       -2 1 1 { null ciput } for
  287.     } {
  288.       (**************** 3 callothersubr -- invalid call\n) print
  289.       /t1tot2 cvx /rangecheck signalerror
  290.     } ifelse
  291.   } if
  292. } bind
  293. /pop {
  294.     %**************** NYI ****************
  295. } bind
  296. /setcurrentpoint {
  297.     %**************** NYI ****************
  298. } bind
  299.  
  300. .dicttomark readonly def    % t1t2ops
  301.